/**
 * \file Principal.cpp
 * \brief Fichier test pour l'annuaire téléphonique
 * \author Pierre-Marc Levasseur, Simon Rodier
 * \version 0.1
 * \date juillet 2014
 *
 */

#include <iostream>
#include <fstream>
#include "Bottin.h"

using namespace std;
using namespace TP2P2;

int main()
{
	cout << "# TP2-partie2 : Bottin téléphonique\n# par Pierre-Marc Levasseur et Simon Rodier" << endl;
	cout << "---------------------\n" << endl;
	ifstream fichier;
	bool fichierValide = true;
	int collisions = 0;
	do
	{
		do
		{
			// ouverture du fichier .txt contenant le bottin
			cout << ">> Veuillez entrer le nom du fichier (avec l'extension) représentant le bottin téléphonique : ";
			string nomFichier;
			getline(cin, nomFichier);
			fichier.open(nomFichier.c_str(), ios::in);
			if(!fichier.is_open())
				cout << ">> Fichier invalide. Veuillez entrer un autre nom." << endl;
		}
		while(!fichier.is_open());

		try
		{
			Bottin bottin(fichier, collisions);
			cout << "\n---------------------\n";
			cout << "(!) Il y a eu " << collisions << " collisions lors du chargement du fichier dans le bottin." << endl;
			cout << "(!) Il y a " << bottin.size() << " personnes dans le bottin." << endl;
			cout << "---------------------\n" << endl; // pour espacer un peut l'affichage

			bool continuer = true;
			// boucle principale, va continuer tant que l'utilisateur le veut
			while(continuer)
			{
				cout << "(!) Voici les opérations que vous pouvez exécuter :" << endl;
				cout << "\t1. Trouver une personne avec son Nom et son prénom." << endl;
				cout << "\t2. Trouver une personne avec son numéro de téléphone." << endl;
				cout << "\t3. Vérifier si une personne est dans le bottin avec son nom et son prénom." << endl;
				cout << "\t4. Vérifier si une personne est dans le bottin avec son numéro de téléphone." << endl;
				cout << ">> Entrez le votre choix (1 à 4) : ";
				int choix = 0;
				cin >> choix;
				cout << endl;

				try {
					switch(choix)
				{
					case 1:
					{
						string nom;
						string prenom;
						vector<string> infos;
						cout << ">> Entrez le nom de la personne que vous voulez trouver :";
						cin.ignore();
						getline(cin, nom);
						cout << ">> Entrez son prénom :";
						getline(cin,prenom);
						try {
							infos = bottin.trouverAvecNomPrenom(nom, prenom);
							cout << "(!) Voici les informations sur " << nom << ", " << prenom << " : " << endl;
							cout << "\tNuméro de téléphone : " << infos[0] << endl;
							cout << "\tNuméro de fax : " << infos[1] << endl;
							cout << "\tCourriel : " << infos[2] << endl;
						}
						catch (logic_error& e)
						{
							cout << "!! Erreur !! :" << endl;
							cout << "\t" << e.what() << endl;
						}
					}
						break;
					case 2:
					{
						string telephone;
						vector<string> infos;
						cout << ">> Entrez le numéro de téléphone (format: (999) 999-9999) de la personne que vous cherchez : " << endl;
						cin.ignore();
						getline(cin, telephone);
						try{
							infos = bottin.trouverAvecTelephone(telephone);
							cout << "(!) Voici les informations trouvées à partir du numéro " << telephone << " : " << endl;
							cout << "\tNom : " << infos[0] << endl;
							cout << "\tPrénom : " << infos[1] << endl;
							cout << "\tNuméro de fax : " << infos[2] << endl;
							cout << "\tCourriel : " << infos[3] << endl;
						}
						catch (logic_error& e)
						{
							cout << "!! Erreur !! :" << endl;
							cout << "\t" << e.what() << endl;
						}
					}
						break;
					case 3:
					{
						string nom;
						string prenom;
						cout << ">> Entrez le nom de la personne que vous cherchez :";
						cin.ignore();
						getline(cin, nom);
						cout << ">> Entrez son prénom :";
						getline(cin,prenom);
						if(bottin.contains(nom, prenom))
							cout << "(!) Cette personne est présente dans le bottin." << endl;
						else
							cout << "(!) Cette personne n'est pas dans le bottin." << endl;
					}
						break;
					case 4:
					{
						string telephone;
						cout << ">> Entrez le numéro de téléphone (format: (999) 999-9999) de la personne que vous cherchez : " << endl;
						cin.ignore();
						getline(cin, telephone);
						if(bottin.contains(telephone))
							cout << "(!) Une personne dans le bottin a ce numéro de téléphone." << endl;
						else
							cout << "(!) Aucune entrée du bottin a ce numéro de téléphone." << endl;

					}
						break;

					default:
						cout << "(!) Votre choix est invalide." << endl;
					}
				}
				catch (exception& e)
				{
					cout << "\n!! Erreur !! :" << endl;
					cout << "\t" << e.what() << endl;
					cout << endl;
				}

				cout << ">> Voulez vous continuer? (entrez 1 pour continuer ou 0 pour arrêter) : ";
				cin >> choix;
				if(!choix) // si la personne entre 0
					continuer = false;
				cout << "\n\n"; // pour espacer l'affichage
			}
		}
		catch (invalid_argument& ia)
		{
			cout<<"ERREUR DE FICHIER: "<<ia.what()<<endl;
			cout<<"SVP essayer de nouveau avec un fichier valide."<<endl;
			fichierValide=false;
			fichier.close();
		}
		catch (...)
		{
			cout<<"Erreur de fichier. SVP essayer de nouveau avec un fichier valide."<<endl;
			fichierValide=false;
			fichier.close();
		}
	}
	while (fichierValide==false);


    return 0;
}
